(function(K) {
K.classLoader().
provides("K.lang.Function").
load(function(I, S) {
	
    var Func = {
    	apply : function(f, s, a) {
    		return f.apply(s, Array.prototype.slice.call(a)); 
    	},
    
    	delegate : function(func) {
    		var f;
    		return function() {
    			return Func.apply((f || (f = func())), this, arguments);
    		};
    	},
    	
    	bind : function(func, thisArg) {
    		if (arguments.length == 1) {
    			thisArg = global;
    		}
    		var args = Array.prototype.slice.call(arguments, 2);
    		return function() {
    			return func.apply(thisArg, args);
    		};
    	}
    };

    return Func;

});

})(k90tools);